"""
    定义函数
        定义形参时，可以为形参指定默认值
        指定了默认值之后，如果用户传递了参数则默认值没有任何作用
        如果用户没有传递，默认值就会生效

        实参的传递方式
            位置参数，就是将对应位置的实参复制给对应位置的形参
            第一个实参赋值给第一个形参，第二个实参赋值给第二个形参...
            fn(1 , 2 , 3)

        关键字参数
            关键字参数不按照形参定义的顺序去传递，而直接根据参数名去传递参数
            fn(b=1 , c=2 , a=3)

        位置参数与关键字参数混合使用
            混合使用关键字和位置参数时，必须将位置参数写在前面
            fn(1,c=30)

"""

# 根据不同的用户名显示不同的欢迎信息
def welcome(username) :
    print('欢迎',username,'光临')

welcome('Mr.Cao')

# 定义函数，在定义形参时，指定默认值，在没有值传入时，默认值生效，传入值的话，默认值不生效
def fn(a = 5, b = 10, c = 20) :
    print('a = ',a)
    print('b = ',b)
    print('c = ',c)

fn(1,2,3)
fn(1,2)
fn()

def fn2(a):
    print('a = ',a)

# 函数在调用时，解析器不会检查实参的类型
# 实参可以传递任意类型的对象
b = 123
b = True
b = 'hello'
fn2(b)

fn2(fn)

def fn4(a) :
    # 在函数中形参进行重新赋值，不会影响其他的变量
    # 如果形参执行的是一个对象，当我们通过形参去修改对象时会影响到所有指向对象的变量
    # a[0] = 30       # 如果形参时列表，可以直接修改列表
    a = 30          # 如果是别的值，可以直接修改值
    print('a = ',a,id(a))

c = 10
# c = [1,2,3]

fn4(c)
print('c = ',c,id(c))
